package org.point.common.util;
import java.util.ArrayList;
import java.util.List;


/**
 * List 集合常用方法
 *
 */
public class ListUtil 
{
	public static  SessionContext sessionContext=SessionContext.getInstance();  
	
	/**
	 * 对 list 进行去重操作. lst 参数不允许为空
	 * 调用示例：
	 * List<Integer> lst = new ArrayList<Integer>();
	 *	lst.add(1);
	 *	lst.add(2);
	 *	lst.add(3);
	 *	lst.add(3);
	 *	lst.add(4);
	 *	lst.add(4);
	 *	lst.add(5);
	 *	List<Integer> result = ListUtil.distinct(lst)
	 *     	  ---  output result = {1,2,3,4,5}
	 * HZ
	 * @param lst
	 * @return
	 */
	public static<T> List<T> distinct(List<T> lst){
		if(lst == null) {
			throw new IllegalArgumentException("lst 参数为空");
		}
		
		List<T> result = new ArrayList<T>();
		for(T t:lst){
			if(t== null){
				continue;
			}
			if(!result.contains(t)){
				result.add(t);
			}
		}
		return result;
	}
	
	/**
	 * 示例：见 test.qbulu.utils.TestListUtil
	 * 对 lst 进行条件筛选, 并返回满足条件筛选的结果集 List
	 * 对接口 filter 方法 filter 返回 true的t对象, 建立新的结果集并返回
	 * HZ
	 * @param lst
	 * @param filter
	 * @return
	 */
	public static<T> List<T> where(List<T> lst,IListFilter<T> filter)
	{
		if(lst == null) {
			throw new IllegalArgumentException("lst 参数为空");
		}
		if(filter == null) {
			throw new IllegalArgumentException("filter 参数为空");
		}
		
		List<T> result = new ArrayList<T>();
		for(T t:lst)
		{
			if(t== null){
				continue;
			}
			if(filter.predicate(t))
			{
				result.add(t);
			}
		}
		
		return result;
	}
	
	/**
	 * 对 lst 进行条件筛选, 并返回满足条件筛选的第一个结果 T 
	 * HZ
	 * @param lst
	 * @param filter
	 * @return
	 */
	public static<T> T firstOrDefault(List<T> lst,IListFilter<T> filter)
	{
		if(lst == null) {
			throw new IllegalArgumentException("lst 参数为空");
		}
		if(filter == null) {
			throw new IllegalArgumentException("filter 参数为空");
		}
		
		for(T t:lst)
		{
			if(t== null)
			{
				continue;
			}
			if(filter.predicate(t))
			{
				return t;
			}
		}
		return null;
	}
	
	/**
	 * 对 lst 进行遍历，并选择其中一个字段的值，组成新的集合进行返回
	 * @param lst
	 * @param selector
	 * @return
	 */
	public static<T,R> List<R> select(List<T> lst,IListSelector<T, R> selector){
		if(lst == null) {
			throw new IllegalArgumentException("lst 参数为空");
		}
		if(selector == null) {
			throw new IllegalArgumentException("filter 参数为空");
		}
		List<R> result = new ArrayList<R>();
		for(T t:lst)
		{
			if(t== null)
			{
				continue;
			}
			R r = selector.select(t);
			result.add(r);	
			
		}
		return result;
	}
	
	/**
	 * 将 lst 进行遍历，取出其中一个字段值进行字符串拼接
	 * @param lst
	 * @param joinChar
	 * @param removeLastChar
	 * @param selector
	 * @return
	 */
	public static<T,R> String join(List<T> lst,char joinChar,Boolean removeLastChar,IListSelector<T, R> selector)
	{
		if(lst == null) {
			throw new IllegalArgumentException("lst 参数为空");
		}
		if(selector == null) {
			throw new IllegalArgumentException("filter 参数为空");
		}
		StringBuilder sBuilder = new StringBuilder();
		for(T t:lst)
		{
			if(t == null)
			{
				continue;
			}
			R r = selector.select(t);
			if(r != null)
			{
				sBuilder.append(r.toString());
				sBuilder.append(joinChar);
			}
		}
		if(removeLastChar && sBuilder.length() > 0) {
			sBuilder.deleteCharAt(sBuilder.length() - 1);
		}
		return sBuilder.toString();
	}
}






